{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## String\n",
    "----"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Đọc thêm về String tại [Python Strings](https://developers.google.com/edu/python/strings)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chuỗi(String)** trong Python cũng là dạng bất biến(immutable) và không thể bị thay đổi "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### I. Indexing\n",
    "\n",
    "![](https://lh3.googleusercontent.com/-WNOOzlAbmB4fdFdactyzZ0rd4eiw3fbQHjopYenkSVW-Nqt3QvjYHIW2SI04yn9tkXclQ8iia_Loi6H7gyP7iIROHAlppc-QT_9XPyPzUVJgxH3RWvxgixZQsh_n6g7AF5JxxnXt3zn83M5YbwFGbPodlWuuaOI-A5NW8YHl4UGxb0MrbNC_E2t40bhEl80BlKWZmPcL-oFHimsHZl8TnPhAxdfYYu8gahhtEkZotJSdmQRTcqj0QMf5-SHzAwp7fGnhhKEEDD2SKxg4nFhtgNSV_rVdXo8rxb9vj2u5g6O3eZXxnGtDrY5wsBTJgpDwnzHY4KGwnkxTWBRoYKH9sLjnBQgfgULUu9LiJHr90tmS1Mw4z4m_KzvVCB70q3jDLNoE370NJghhbWXhDUM4Abcq2J-pYAQvbaOyyUZJS6PLOp-58mRl6GTFOjMx7so6SSr_xHqeJJYxfYqDfnZ_gUe_AuokO8C52MJ5hQkMDWDiZ_VUahww7pmocku4fW-Hs2U6BL5qNeynb4h2jg7WXRl7dIEfG0qCLVPzCJwQY_lYka9t8mzJ8oLaOg25tPKdn03QyZA5cFaHqfpjNpVvbmWt3Kl2k3Sgvtm5YrjVVVBcG82Hqk2zBZmeW5dJ25-uV-774Fs3Sr0kR7aPQESSDYPIct79SXRqg=w269-h150-no)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Chuỗi bao gồm một tập hợp các ký tự sắp xếp tuần tự, mỗi ký tự đều có một **chỉ mục(index)** riêng. \n",
    "\n",
    "Chỉ mục được đánh 2 chiều từ trái qua phải và từ phải qua trái. Bên dưới là cách truy cập vào từng ký tự của chuỗi thông qua chỉ mục: **word[index]** "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'h'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "word = \"hello\"\n",
    "word[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'e'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "word[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'o'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Truy cập vào phần tử cuối cùng\n",
    "# Điều này rất thuận lợi trong trường hợp chúng ta không biết cụ thể chiều dài chuỗi\n",
    "word[-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### II. Hàm cắt chuỗi (String Slices)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cú pháp: **string[begin:end]**\n",
    "\n",
    "Hàm này sẽ cắt chuỗi từ phần tử **ban đầu** cho đến phần tử **trước** phần tử **kết thúc**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'e'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Cắt chuỗi từ phần tử có chỉ mục là 1 đến phần tử có chỉ mục nhỏ hơn 2\n",
    "# tức là chỉ lấy phần tử có chỉ mục là 1\n",
    "word[1:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'lo'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Cắt chuỗi từ phần tử có chỉ mục 3 cho đến hết\n",
    "word[3:]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'lo'"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Kết quả tương đương\n",
    "word[-2:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'hell'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Cắt chuỗi từ đầu cho đến phần tử có chỉ mục 3\n",
    "word[:4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Kết quả tương đương"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'hell'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "word[:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'hello'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Copy cả chuỗi\n",
    "word[:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ello'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Trong trường hợp chỉ mục của phần tử cuối lớn hơn so với độ dài của chuỗi\n",
    "# hàm trả về chuỗi từ phần tử đầu cho đến hết chuỗi \n",
    "word[1:2000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### III. Các phương thức"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1. lower()\n",
    "Trả về dạng chữ thường của chuỗi."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'gdg hanoi'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "name = \"GDG Hanoi\"\n",
    "name.lower()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2. upper() \n",
    "Trả về dạng chữ hoa của chuỗi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'HANOI'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location = \"hanoi\"\n",
    "location.upper()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 3. isalpha()\n",
    "Kiểm tra chuỗi chỉ bao gồm chữ cái hay không"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"ngoc\".isalpha()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"haiduong2\".isalpha()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 4. isdigit()\n",
    "Kiểm tra chuỗi chỉ bao gồm chữ số hay không"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"123\".isdigit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"45a6\".isdigit()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 5. startswith()\n",
    "Kiểm tra chuỗi có bắt đầu bằng một chuỗi cho trước hay không"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"hanoi\".startswith(\"h\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"hanoi\".startswith(\"ha\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 6. endswith()\n",
    "Kiểm tra chuỗi có kết thúc bằng một chuỗi cho trước hay không"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"vietnam\".endswith(\"m\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"vietnam\".endswith(\"ietnam\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 7. find()\n",
    "Tìm một chuỗi nằm trong chuỗi cho trước\n",
    "Hàm trả về \n",
    "    - Vị trí (index) đầu tiên mà chuỗi đang tìm bắt đầu trong chuỗi cho trước\n",
    "    - -1 nếu chuỗi đang tìm không năm trong chuỗi cho trước"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Vietnam is beautiful'"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"Vietnam is beautiful\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11"
      ]
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Trong trường hợp này chuỗi cho trước có chứa chuỗi cần tìm \n",
    "# và hàm trả về vị trí bắt đầu của chuỗi cần tìm trong chuỗi cho trước\n",
    "# Chú ý: Khoảng trắng cũng được tính là một phần tử có index\n",
    "\"Vietnam is beautiful\".find(\"beautiful\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1"
      ]
     },
     "execution_count": 189,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"Vietnam is beautiful\".find(\"not\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 8. replace()\n",
    "Trả về chuỗi một phần được thay thế mới"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'I love you'"
      ]
     },
     "execution_count": 190,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"I like you\".replace(\"like\", \"love\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 9. split()\n",
    "\n",
    "Trả về một list các phần tử được chia cách bởi một dấu phân cách(delimiter) cho trước"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Today', 'is', 'awesome']"
      ]
     },
     "execution_count": 192,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Tách các phần từ phân cách bằng một khoảng trắng trong câu\n",
    "\"Today is awesome\".split(\" \")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 10. join()\n",
    "Trả về một chuỗi được ghép bởi các phần tử từ một list theo một dấu phân cách cho trước"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'a, b, c, d, e, f'"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\", \".join([\"a\", \"b\", \"c\", \"d\", \"e\", \"f\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 11. strip() \n",
    "Trả về chuỗi mới được loại bỏ khoảng trắng 2 đầu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Nguyen Ba    Ngoc'"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\" Nguyen Ba    Ngoc    \".strip()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 12. capitalize()\n",
    "Trả về chuỗi mới được viết hoa đầu câu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Ngoc'"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"ngoc\".capitalize()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Ha'"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"Ha\".capitalize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 13.len()\n",
    "Trả về độ dài của một chuỗi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(\"I am coding a powerful tool\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### IV. %\n",
    "\n",
    "Hàm hỗ trợ ghép biến vào trong chuỗi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Today is Monday'"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"Today is %s\" %(\"Monday\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"3 little pigs come out or I'll huff and puff and blow down\""
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# %d đại diện cho số\n",
    "# %s đại diện cho chuỗi\n",
    "\"%d little pigs come out or I'll %s and %s and %s\" % (3, 'huff', 'puff', 'blow down')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V. Unicode"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [],
   "source": [
    "u_string = u'Việt Nam đẹp lắm ta ơi.'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "u'Vi\\u1ec7t Nam \\u0111\\u1eb9p l\\u1eafm ta \\u01a1i.'"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u_string"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Convert chuỗi unicode thành bytes dạng utf-8\n",
    "b = u_string.encode('utf-8')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Vi\\xe1\\xbb\\x87t Nam \\xc4\\x91\\xe1\\xba\\xb9p l\\xe1\\xba\\xafm ta \\xc6\\xa1i.'"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Convert ngược lại từ encoded bytes thành chuỗi unicode\n",
    "u = unicode(b, 'utf-8')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "u'Vi\\u1ec7t Nam \\u0111\\u1eb9p l\\u1eafm ta \\u01a1i.'"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
